package trainee.compra.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import trainee.compra.to.DetalleCarroTO;
import trainee.compra.utilitarios.ExcepcionConexion;

public class DetalleCarroDAO {
    private EntityManager entityManager;

    public DetalleCarroDAO() {

    }

    /**
     * Se contruye el objeto entregandole el Entity Manager para poder
     * realizar las consoltas a la base de datos
     * 
     * @param entityManager
     */
    public DetalleCarroDAO(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    /**
     * Entrega un listado con todos los productos existentes en la base de
     * datos
     * 
     * @param ninguno
     * @return Listado de tipo PoductoTO con todos los productos.
     */
    public List<DetalleCarroTO> obtenerTodosDetalles() throws ExcepcionConexion {
        try {
            Query query =
                    entityManager.createQuery("select p from DetalleCarroTO p");
            return query.getResultList();
        } catch (Exception e) {
            throw new ExcepcionConexion(
                    "Error al conectar a la base de datos. Comuniquese con el administrador");
        }
    }

    /**
     * Agrega un producto a un carro
     * 
     * @param idCarro
     *            id del carro a agregar el producto
     * @param codProducto
     *            codigo del producto a agregar
     * @param cantidad
     *            canditad de producto a agregar
     */
    public void agregarProducto(DetalleCarroTO item) throws ExcepcionConexion {
        try {
            entityManager.persist(item);
        } catch (Exception e) {
            throw new ExcepcionConexion(
                    "Error al conectar a la base de datos. Comuniquese con el administrador");
        }
    }

    /**
     * entrega todos los detalle de un carro
     * 
     * @param idCarro
     *            carro a entregar sus productos
     * @return listado de detalle a entegar
     */
    public List<DetalleCarroTO> obtenerDetalleCarro(int idCarro)
            throws ExcepcionConexion {
        try {
            Query query =
                    entityManager
                            .createQuery(
                                    "select dc from DetalleCarroTO dc where dc.idCarro = :c")
                            .setParameter("c", idCarro);
            List<DetalleCarroTO> listaResultado = query.getResultList();
            String temporalNombreLazy;
            for (DetalleCarroTO detalle : listaResultado) {
                temporalNombreLazy = detalle.getProducto().getNombre();
            }
            return listaResultado;
        } catch (Exception e) {
            throw new ExcepcionConexion(
                    "Error al conectar a la base de datos. Comuniquese con el administrador");
        }
    }

    /**
     * elimina todos los productos de un carro almacenado en la base de datos
     * 
     * @param idCarro
     *            carro al cual se le eliminaran los productos
     */
    public void eliminarTodosDetalleCarro(int idCarro) throws ExcepcionConexion {
        try {
            Query query =
                    entityManager
                            .createQuery("delete from DetalleCarroTO dc where dc.idCarro = :p");
            query.setParameter("p", idCarro).executeUpdate();
        } catch (Exception e) {
            throw new ExcepcionConexion(
                    "Error al conectar a la base de datos. Comuniquese con el administrador");
        }
    }

    /**
     * elimina un producto de un carro almacenado en la base de datos
     * 
     * @param idCarro
     *            carro al cual se le eliminaran los productos
     */
    public void eliminarUnDetalleCarro(int idCarro, String codigoProducto)
            throws ExcepcionConexion {
        try {
            Query query =
                    entityManager
                            .createQuery("delete from DetalleCarroTO dc where dc.idProducto = :p and dc.idCarro = :c");
            query.setParameter("p", codigoProducto).setParameter("c", idCarro)
                    .executeUpdate();
        } catch (Exception e) {
            throw new ExcepcionConexion(
                    "Error al conectar a la base de datos. Comuniquese con el administrador");
        }
    }

    /**
     * aumenta en uno la cantidad de un producto del carro
     * 
     * @param idCarro
     *            carro del producto al cual se aumentara en uno
     * @param codigoProducto
     *            producto al cual se aumentara en uno
     */
    public void aumentarCantidadProducto(int idCarro, String codigoProducto)
            throws ExcepcionConexion {
        try {
            Query query =
                    entityManager
                            .createQuery("update DetalleCarroTO dc set dc.cantidad = dc.cantidad+1 where dc.idCarro = :c and idProducto = :p");
            query.setParameter("c", idCarro).setParameter("p", codigoProducto)
                    .executeUpdate();
        } catch (Exception e) {
            throw new ExcepcionConexion(
                    "Error al conectar a la base de datos. Comuniquese con el administrador");
        }
    }

    /**
     * disminuir en uno la cantidad de un producto del carro
     * 
     * @param idCarro
     *            carro del producto al cual se disminuira en uno
     * @param codigoProducto
     *            producto al cual se disminuira en uno
     */
    public void disminuirCantidadProducto(int idCarro, String codigoProducto)
            throws ExcepcionConexion {
        try {
            Query query =
                    entityManager
                            .createQuery("update DetalleCarroTO dc set dc.cantidad = dc.cantidad-1 where dc.idCarro = :c and idProducto = :p");
            query.setParameter("c", idCarro).setParameter("p", codigoProducto)
                    .executeUpdate();
        } catch (Exception e) {
            throw new ExcepcionConexion(
                    "Error al conectar a la base de datos. Comuniquese con el administrador");
        }
    }
}
